package com.qf.config;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

//@Aspect
//@Component //对象的创建交给Spring容器
public class MyAspect {
    //定义切点表达式
    @Pointcut("execution(* *.*.service.impl.*.*(..))")
    public void pt1() {}

    //@Before("pt1()")//前置通知
    public void before() {
        System.out.println("执行业务之前,前置通知");
        //以后就是对业务增强的系统监控相关的逻辑:将业务方法和增强的方法分离!
    }

    //@AfterReturning("pt1()")
    public void afterreturning(){
        System.out.println("执行业务之后,后置通知");
    }
    //环绕通知
    //配置环绕通知注解
    //@Around("pt1()")
    public Object round(ProceedingJoinPoint joinPoint){
        //现在调用的业务方法,对业务方法增强
        Object obj = null;
        try {
            //前置通知
            before(); //直接写增强的代码.../抽取一个方法..
            obj = joinPoint.proceed();//调用业务方法
            //后置通知
            afterreturning();
            return obj ;
        } catch (Throwable throwable) {
            throwable.printStackTrace();//直接打印
        }
        return null;
    }

}